﻿#include <iostream>
#include <algorithm>  // std::sort
#include <Windows.h>
#include <mmdeviceapi.h>
#include <endpointvolume.h>
#include "QNative.hpp"

// 获取系统时间
QAPI_EXPORT float QAPI_CALL getSysTime()
{
    // 简易数据类型 可以直接返回
    return 114.5566f;
}

// 检查是不是CPP环境
QAPI_EXPORT bool QAPI_CALL isCpp()
{
    return true;
}

// 获取LevelName
QAPI_EXPORT void QAPI_CALL getLevelName(CSTRING_CALL_BACK out)
{
    // 复杂数据类型(不定长大小) 需要使用回调处理
    out("Minecraft");
}

// 获取实体列表
QAPI_EXPORT void QAPI_CALL getRuntimeEntityList(CSTRING_CALL_BACK out)
{
    out("-123");
    out("-456");
    out("-1145");
    out("-1234");
}

// 查询是否存在xxx实体
QAPI_EXPORT bool QAPI_CALL hasEntity(const char* entityId)
{
    return std::string_view(entityId) == "-1145";
}

// 重新排序字符串 按字节长度
QAPI_EXPORT void QAPI_CALL sorted(QArrayStruct baseStr, CSTRING_CALL_BACK out)
{
    auto userStrList = QArrayStruct::parseStringArray(baseStr);
    // 根据字节长度排序
    std::sort(userStrList.begin(), userStrList.end(), [](const std::string& a, const std::string& b)
        {
            return a.size() < b.size();
        });
    // 返回数据
    for (const auto& str : userStrList)
    {
        out(str.c_str());
    }
}

// 获取实体NBT数据
QAPI_EXPORT void QAPI_CALL getEntityNBT(const char* entityId, CSTRING_CALL_BACK out)
{
    // 这里没有JSON库就直接随便写了
    out("{\"health\": 20, \"speed\": 0.23, \"entityType\": \"minecraft:zombie\"}");
}

// 获取UTF8字符串(测试)
QAPI_EXPORT void QAPI_CALL getUTF8Str(CSTRING_CALL_BACK out)
{
    out("这是一段UTF8字符串");
}

// sumTo计算
QAPI_EXPORT int QAPI_CALL sumTo(int start, int to, int length)
{
    if (length == 0)
    {
        return 0;
    }
    int sum = 0;
    for (int i = start; i < to; i += length)
    {
        sum += i;
    }
    return sum;
}

// 获取字符串字节大小
QAPI_EXPORT int QAPI_CALL getStringByteSize(const char* cStr)
{
    return std::string_view(cStr).size();
}

// 设置系统音量
QAPI_EXPORT void QAPI_CALL setSystemSoundVolume(int value)
{
    // 限制音量值在 0 到 100 之间
    if (value > 100)
    {
        value = 100;
    }
    else if (value < 0)
    {
        value = 0;
    }

    // 初始化
    CoInitialize(NULL);

    // 获取默认音频设备
    IMMDeviceEnumerator* pEnumerator = nullptr;
    IMMDevice* pDevice = nullptr;
    IAudioEndpointVolume* pVolume = nullptr;

    CoCreateInstance(__uuidof(MMDeviceEnumerator), nullptr, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void**)&pEnumerator);
    pEnumerator->GetDefaultAudioEndpoint(eRender, eMultimedia, &pDevice);
    pDevice->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_ALL, nullptr, (void**)&pVolume);

    // 设置音量
    pVolume->SetMasterVolumeLevelScalar(value / 100.0f, nullptr);

    // 清理
    pVolume->Release();
    pDevice->Release();
    pEnumerator->Release();

    CoUninitialize();
}

// 获取系统音量
QAPI_EXPORT int QAPI_CALL getSystemSoundVolume()
{
    float currentVolume = 0.0f;

    // 初始化
    CoInitialize(NULL);

    // 获取默认音频设备
    IMMDeviceEnumerator* pEnumerator = nullptr;
    IMMDevice* pDevice = nullptr;
    IAudioEndpointVolume* pVolume = nullptr;

    CoCreateInstance(__uuidof(MMDeviceEnumerator), nullptr, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void**)&pEnumerator);
    pEnumerator->GetDefaultAudioEndpoint(eRender, eMultimedia, &pDevice);
    pDevice->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_ALL, nullptr, (void**)&pVolume);

    // 获取当前音量
    pVolume->GetMasterVolumeLevelScalar(&currentVolume);

    // 清理
    pVolume->Release();
    pDevice->Release();
    pEnumerator->Release();

    CoUninitialize();

    // 返回当前音量百分比
    return static_cast<int>(currentVolume * 100);
}